package com.example.util;

import com.example.dto.ImportOrderDto;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class ExcelUtil {

    public static List<ImportOrderDto> readMultipartFile(MultipartFile file) throws IOException {
        List<ImportOrderDto> dtoList = new ArrayList<>();
        try (InputStream is = file.getInputStream()) {
            Workbook workbook = new XSSFWorkbook(is);
            Sheet sheet = workbook.getSheetAt(0);

            // 跳过标题行
            int rowIndex = 1;

            while (rowIndex <= sheet.getLastRowNum()) {
                Row row = sheet.getRow(rowIndex++);

                if (row == null || isRowEmpty(row)) {
                    continue;
                }

                ImportOrderDto dto = new ImportOrderDto();

                // 序号 - 第一列，这里需要特别处理，因为它可能是"1.0"这样的字符串
                Cell cell = row.getCell(0);
                if (cell != null && cell.getCellType() == CellType.NUMERIC) {
                    // 将数字类型的单元格转换为长整型
                    dto.setId((long) cell.getNumericCellValue());
                } else {
                    // 如果不是数字类型，尝试转换为字符串，然后转换为长整型
                    String cellValue = getCellStringValue(cell);
                    dto.setId(cellValue != null ? Long.parseLong(cellValue) : null);
                }

                // 订单编号 - 第二列
                dto.setOrderSn(getCellStringValue(row.getCell(1)));
                // 物流单号 - 第三列
                dto.setDeliverySn(getCellStringValue(row.getCell(2)));

                dtoList.add(dto);
            }
        }
        return dtoList;
    }

    /**
     * 检查行是否为空。
     *
     * @param row 单元行
     * @return 如果行为空返回true，否则返回false
     */
    private static boolean isRowEmpty(Row row) {
        if (row == null) {
            return true;
        }
        for (Cell cell : row) {
            if (cell != null && cell.getCellType() != CellType.BLANK) {
                return false;
            }
        }
        return true;
    }

    /**
     * 获取单元格的字符串值。
     *
     * @param cell 单元格
     * @return 单元格的字符串值
     */
    private static String getCellStringValue(Cell cell) {
        if (cell == null) {
            return null;
        }
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                return String.valueOf(cell.getNumericCellValue());
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return String.valueOf(cell.getCellFormula());
            default:
                return "";
        }
    }
}